#pragma once

#include <QXmlContentHandler>
#include "BaseLoader.h"

class BaseParser : public QXmlContentHandler
{
protected:
    struct timespec _startTime,
        _endTime;
    uint _numOfElements;
    int _maxValueTextSize,
        _maxPathTextSize,
        _maxDepth;
    uint _loaderTime;

    BaseLoader& _loader;
    QVector<EdgeElement *> _ancestor;
    PathMap _pathMap;
    QList<QString> _path;
    QString _completePath;

    uint _addPath(const QString& localName);
    void _addElement(const QString& name, const QString& value, uint path_id, bool attribute);
    static QString _generatePath(QList<QString> & v);

public:
    BaseParser(const QString& filename, BaseLoader& loader);
    virtual void setDocumentLocator(QXmlLocator* locator);
    virtual bool startDocument();
    virtual bool endDocument();
    virtual bool startPrefixMapping(const QString& prefix, const QString& uri);
    virtual bool endPrefixMapping(const QString& prefix);
    virtual bool startElement(const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts);
    virtual bool endElement(const QString& namespaceURI, const QString& localName, const QString& qName);
    virtual bool characters(const QString& ch);
    virtual bool ignorableWhitespace(const QString& ch);
    virtual bool processingInstruction(const QString& target, const QString& data);
    virtual bool skippedEntity(const QString& name);
    virtual QString errorString() const;

    uint getLoaderTime() { return _loaderTime; }
};
